home *** CD-ROM | disk | FTP | other *** search
- ;
- ; read34.asm
- ;
- ; interface code for the "2 more players" parallel port hack.
- ;
- csect text ; this here's the meat
-
- xdef Name ; Name of our application, so that
- Name dc.b '4play',0 ; other applications will know
- ; who's tying up the port. ;-)
-
-
- xdef _read34 ; function names for linker
- xdef _getport
- xdef _freeport
-
- xref _portptr ; c pointer for port data
- xref _fireptr ; c pointer for fire buttons
-
- xref _SysBase ; exec system base (from c.o)
-
-
- INCLUDE "resources/misc.i"
-
-
- xdef MiscName
- MiscName MISCNAME ; macro from resources/misc.i
-
- xdef _MiscResource
- _MiscResource dc.l 0 ; place to store misc.resource base
-
- ;parallel port hardware addresses (from amiga.lib)
-
- xref _ciaaprb ; the actual port address
- xref _ciaaddrb ; data direction register
-
- xref _ciabpra ; control lines are here
- xref _ciabddra ; data direction register
- ;from amiga.lib
- xref _LVOOpenResource
- xref _LVOAllocMiscResource
- xref _LVOFreeMiscResource
-
- _getport
- ;This routine simply allocates the parallel port in a system friendly
- ;way, and sets up the lines we want to use as input lines.
- ;
-
-
- ;save registers on the stack
-
- movem.l a2-a6/d2-d7,-(sp) ; push regs
-
-
- ;open the misc.resource
-
- lea MiscName,a1 ; put name of misc.resource in a1
- movea.l _SysBase,a6 ; put SysBase in a6
- jsr _LVOOpenResource(a6)
- move.l d0,_MiscResource ; store address of misc.resource
- bne.s grabit
-
- ;Oops, couldn't open misc.resource. Sounds like big trouble to me.
-
- moveq #20,d0 ; error code
- bra done
-
-
- ;This is where we grab the hardware. If some other task has allocated
- ;the parallel data port or the parallel control bits, this routine will
- ;return non-zero.
-
- ;This part grabs the port itself
-
- grabit lea Name,a1 ; The name of our app
- moveq #MR_PARALLELPORT,d0 ; what we want
- movea.l _MiscResource,a6 ; MiscResource Base is in A6
- jsr _LVOAllocMiscResource(a6)
- move.l d0,d1
- beq.s grab2
-
- ;well, somebody else must've got the port first.
-
- moveq #30,d0 ; error code
- bra done
-
- ;This part grabs the control bits (busy, pout, and sel.)
- ;We really don't need pout, but it comes free with PARALLELBITS,
- ;so we'll take it anyway.
-
- grab2 lea Name,a1 ; The name of our app
- moveq #MR_PARALLELBITS,d0 ; what we want
- jsr _LVOAllocMiscResource(a6)
- move.l d0,d1
- beq.s setread
-
- ;well, somebody else must've got the bits first.
-
- moveq #40,d2
- bra freepar
-
-
- ;set up parallel port for reading
-
- setread move.b #0,_ciaaddrb ; all lines read
-
- andi.b #$FF,_ciabddra ; busy, pout, and sel. to read
-
- ;Well, we made it this far, so we've got exclusive access to
- ;the parallel port, and all the lines we want to use are
- ;set up. From here we can just put back the regs and return to
- ;the caller.
-
- bra done
-
-
- ;If something happened AFTER we got exclusive access to the parallel port,
- ;we'll need to let go of the port before we return the error.
-
- freepar moveq #MR_PARALLELPORT,d0
- movea.l _MiscResource,a6
- jsr _LVOFreeMiscResource(a6)
-
- move.l d2,d0 ; put error code into d0
-
-
- ;Restore registers and return
- ;(error code is in d0)
-
- done movem.l (sp)+,a2-a6/d2-d7 ; pop regs
- rts
-
-
- _freeport
- ;This routine just makes sure that we let go of the parallel port and
- ;control lines, so somebody else can use 'em, now that we're all done.
- ;
- ;PS - Don't call this one if you got an error from _getport, as some
- ;of the resources might not have been opened, etc.
- ;
-
- ;save registers on the stack
-
- movem.l a2-a6/d2-d7,-(sp) ; push regs
-
-
- ;free control lines
-
- moveq #MR_PARALLELBITS,d0
- movea.l _MiscResource,a6
- jsr _LVOFreeMiscResource(a6)
-
-
- ;free parallel port
-
- moveq #MR_PARALLELPORT,d0
- movea.l _MiscResource,a6
- jsr _LVOFreeMiscResource(a6)
-
-
- ;Clean up, restore registers, and return
-
- movem.l (sp)+,a2-a6/d2-d7 ; pop regs
- rts
-
-
- _read34
- ;All this routine does is copy the data from the ports to other addresses.
- ;
- ;In this case the destinations happens to be whatever C variables are
- ;pointed at by _portptr and _fireptr.
- ;
-
- movea.l _portptr,a1 ; a1 now holds the destination
- move.b _ciaaprb,(a1) ; move byte from port to dest
-
- movea.l _fireptr,a1 ; a1 now holds the destination
- move.b _ciabpra,(a1) ; move byte from port to dest
-
- rts
-
- end
-